/*
 * Copyright (C) 2010-2011 Graz University of Technology, Austria. All Rights reserved. 
 *
 * Contact: Simone Kopeinik <simone.kopeinik@tugraz.at>
 * 	   Graz University of Technology, Knowledge Management Institute, Brückenkopfgasse 1/6, 8020 Graz 	
 * 	   <http://www.kmi.tugraz.at/>
 * 
 * This software is part of the TARGET platform developed by the
 * TARGET EC-funded project www.reachyourtarget.org
 *
 * This software is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * The GNU General Public License is available at <http://www.gnu.org/licenses/>.
 *
 */
package at.tugraz.kmi.css.cbkst2.prereq.structurevis;

import org.apache.commons.collections15.Transformer;

import at.tugraz.kmi.css.cbkst2.CbKSTCompetence;
import at.tugraz.kmi.css.cbkst2.PrerequesiteRelation;
import at.tugraz.kmi.css.cbkst2.prereq.CompetenceManager;

import com.google.inject.Inject;
import com.jgoodies.binding.beans.PropertyConnector;
import com.jgoodies.binding.value.ValueModel;

import edu.uci.ics.jung.algorithms.layout.StaticLayout;
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;

/**
 * Transitive Closure Visualisation. Mostly needed for demonstration and
 * debugging purposes.
 * 
 * @author Georg Öttl <georg.oettl@gmail.com>
 * 
 */
public final class StructureClosureView extends
		VisualizationViewer<CbKSTCompetence, PrerequesiteRelation> {

	private static final long				serialVersionUID	= 1L;
	private final CompetenceManagerModel	presentationModel;

	@Inject
	StructureClosureView(CompetenceManagerModel graphModel) {
		super(new StaticLayout<CbKSTCompetence, PrerequesiteRelation>(
				new SparseGraph<CbKSTCompetence, PrerequesiteRelation>()));
		presentationModel = graphModel;
		getRenderContext().setVertexLabelTransformer(
				new Transformer<CbKSTCompetence, String>() {
					@Override
					public String transform(CbKSTCompetence input) {
						return input.getName();
					}
				});
		setGraphMouse(new StructureClosureGraphMouse(getRenderContext()));
		initComponents();
	}

	private void initComponents() {
		ValueModel prerequesiteGraph = presentationModel
				.getModel(CompetenceManager.PROPERTY_TRANSITIVE_CLOSURE_GRAPH);
		PropertyConnector.connectAndUpdate(new FRLayoutConverter(
				prerequesiteGraph), this, "graphLayout");
	}

}
